package m2acsis.algebre.anneau;

import java.util.ArrayList;
import java.util.List;

import m2acsis.algebre.ElemAnneau;
import m2acsis.algebre.ElemGroupe;
import m2acsis.algebre.helpers.ListHelper;
import m2acsis.algebre.impl.Polynome;

public class Polynome2 extends Polynome implements ElemAnneau{

	ElemAnneau[] coefficients;
	
	
	public Polynome2(ElemAnneau[] coefficients) {
		super(coefficients);
		
		this.coefficients = coefficients;
	}
	
	@Override
	public ElemGroupe neutre() {
		return new Polynome2(new ElemAnneau[]{(ElemAnneau) neutre});
	}
	
	@Override
	public ElemGroupe oppose() {
		return new Polynome2( (ElemAnneau[]) ListHelper.getArray(getOpposeCoefficients()));
	}
	
	@Override
	public ElemGroupe somme(ElemGroupe e) {
		
		if(e instanceof Polynome2){
			
			Polynome2 pl = (Polynome2)e;
			return new Polynome2((ElemAnneau[]) ListHelper.getArray(getSommeCefficients(pl.coefficients)));
		}
		
		return null;
	}

	@Override
	public ElemAnneau inverse() {
		
		//Si neutre est de type X alors tout le tableau est de type X
		if(neutre instanceof ElemAnneau){
			
			ElemAnneau[] inverse = new ElemAnneau[degree]; 
			for(int i = 0; i < degree; i++)
				if(!coefficients[i].equals(coefficients[i].neutre()))
					inverse[i] = coefficients[i].inverse();
				else
					throw new Error("l'element " + coefficients[i].toString() + "n'a pas d'inverse");
			
			return new Polynome2(inverse);
		}
		
		
		return null;
	}

	@Override
	public ElemAnneau produit(ElemAnneau e) {
		
		if(e instanceof Polynome2){
			
			Polynome2 pe = (Polynome2) e;
			
			List<ElemAnneau> coefProd = new ArrayList<ElemAnneau>();
			
			for(int i = 0; i < degree; i++)
				for(int j = 0; j < pe.degree; j++){
					coefProd.add((ElemAnneau) neutre);
				}
			
			for(int i = 0; i < degree; i++)
				for(int j = 0; j < pe.degree; j++){
					coefProd.get(i + j).somme(coefficients[i].produit(pe.coefficients[j]));
				}
			
			
			for(int i = coefProd.size(); i > 0 ; i--)
				if(coefProd.get(i -1).equals(neutre))
					coefProd.remove(i -1);
			
			if(coefProd.size() == 0)
				return new Polynome2(new ElemAnneau[]{(ElemAnneau) neutre});
			
			return new Polynome2((ElemAnneau[]) coefProd.toArray( new ElemAnneau[]{}));
		}
		
		return null;
	}

	@Override
	public ElemAnneau unite() {
		
		if(neutre instanceof ElemAnneau)
			return new Polynome2(new ElemAnneau[]{((ElemAnneau) neutre).unite()});
		
		return null;
	}

}
